
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.JDOMParseException;
import org.jdom.input.SAXBuilder;




/**
 * La classe Settings permette di parsare il file impostazioni.xml, inserendo i 
 * dati letti all'interno di variabili e di oggetti che identificano i parametri
 * di gioco
 * @author Lucia Mongardi
 */
public class Settings {
    // crea e inizializza una lista di tipo Phrase con le frasi da indovinare e i suggerimenti
     private List <Phrase> phrases= new ArrayList<Phrase>();
     // crea e inizializza una lista di tipo String con i nomi dei giocatori
     private List <String> players= new ArrayList <String>();
 Document doc;
SAXBuilder builder;
Element rootElement;

    private List <String[]> elements=new ArrayList<String[]>();
    private List <String> elementsWheel=new ArrayList<String>();
    /**
     * Inizializza un nuovo oggetto Settings che imposta i parametri necessari
     * per poter leggere da un file xml.
     */
public Settings(){
  
      try {
          // controlla la validità del file attraverso la lettura del file dtd
            builder = new SAXBuilder(true);
          
            doc = builder.build(new File("../setup/impostazioni.xml"));
          // restituisce il root del documento
            rootElement = doc.getRootElement();
            
           // richiama il metodo Phrases
            Phrases();
            //richiama il metodo Players
            Players();
            // richiama il metodo Wheel
            Wheel();
            // richiama il metodo readElements
            readElements();
            
            }catch(JDOMParseException ex){
            
            JOptionPane.showMessageDialog(new JPanel(), "errore file xml");
            System.exit(0);
        } catch (JDOMException ex) {
            System.out.println("Errore file xml");
            JOptionPane.showMessageDialog(new JPanel(), "errore file xml");
            System.exit(0);
        } catch (IOException ex) {
             System.out.println("Errore file xml");
            JOptionPane.showMessageDialog(new JPanel(), "errore file xml");
            System.exit(0);
        }
        
    
}
/**
 * Inizializza gli elementi necessari per poter leggere i tag relativi all'elemento 
 * phrases
 */
public void Phrases(){
    Element phrases_el=rootElement.getChild("phrases");
            List<Element> children=phrases_el.getChildren();
            // scorre gli elementi figli di phrases ed inserisce un nuovo oggetto Phrase leggendo
            // il tag text ed hint, e lo inserisce nella lista phrases di tipo Phrase 
            for(int i=0; i<children.size();i++){
                
                phrases.add(new Phrase(children.get(i).getChildText("text").trim(),children.get(i).getChildText("hint").trim()));
            }
         
}
/**
 * Restituisce una lista di tipo Phrase contenente oggetti di tipo Phrase
 * @return una lista di tipo Phrase
 */
public List<Phrase> getPhrases(){
   
     return phrases;
         
}
/**
 * Inizializza gli elementi necessari per poter leggere i tag relativi all'elemento players
 */
public void Players(){
    Element phrases_el=rootElement.getChild("players");
    // crea una lista di elementi che identificano i figli dell'elemento players
            List<Element> children=phrases_el.getChildren();
            // scorre  la lista degli elementi figli ed inserisce il nome del giocatore
            // nella lista players di tipo String
            for(int i=0; i<children.size();i++){
               
                players.add(children.get(i).getChildText("name").trim());
            }
            // controlla che il numero massimo dei giocatori sia compreso tra 0 e 3
            if(players.size()>3 || players.size()<1){
                 JOptionPane.showMessageDialog(new JPanel(), "errore file xml: n° di giocatori errato");
                 System.exit(0);
            }
                

}
/**
 * Restituisce una lista di tipo Stringa contenente i nomi dei giocatori
 * @return
 */
public List<String> getPlayers(){
   // normalize text representation
     return players;
         
}
/**
 * Inizializza gli elementi necessari per poter leggere i tag relativi all'elemento wheel
 */
public void Wheel(){
    Element phrases_el=rootElement.getChild("wheel");
    Element elements=phrases_el.getChild("elements");
 
            // crea e inizializza una lista  che identificano gli elementi figli
    // dell'elemento elements
            List<Element> children=elements.getChildren();
            // scorre la lista children  per poter leggere il valore 
            // e la probabilità degli elementi della ruota
            for(int i=0; i<children.size();i++){
                 String [] element= new String[2];

                element[0]=children.get(i).getChildText("value").trim();

                element[1]=children.get(i).getChildText("probability").trim();
                this.elements.add(i,element);

            }
          

}
/**
 * Legge gli elementi della lista elements contenente i valori e le probabilità della ruota
 * ed aggiunge il valore di un elemento della ruota in funzione della sua probabilità
 */
private void readElements(){
 
    for (int i=0; i<elements.size();i++){
        // conrolla la stringa della probabilità contenente il valore numerico in percentuale, 
        // e lo trasforma in un intero per poi inserire l'elemento
            for(int j=0;j<Integer.parseInt(elements.get(i)[1].replace('%', ' ').trim());j++){
            elementsWheel.add(elements.get(i)[0]);
            }
    }
 
}
/**
 * Restituisce una lista di tipo Stringa contenente i valori della ruota
 * @return un oggetto List di tipo String contenente i valori della ruota
 */
public List<String> getElementsWheel(){
    return elementsWheel;
}

}
